package day32;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;

// 方法引用
// 当Lambda表达式想要实现的功能, 已经有方法实现
// 可以通过方法引用, 将已实现的方法引用为lambda表达式
// 可以把方法引用理解为lambda表达式的另一种体现形式
// 语法
// 对象::实例方法名
// 类::静态方法名
// 类::实例方法名
// 注意:
// 1. 所引用的方法的参数列表与返回值类型, 必须与lambda表达式本身的参数列表与返回值类型一致
// 2. 引用方法时, 只需要指明方法名称即可, 不需要带小括号
public class Demo03 {
	public static void main(String[] args) {
		test03();
	}

	// 类::实例方法名
	private static void test03() {
		// lambda表达式的第一个参数, 是实例方法的调用者
		// lambda表达式的第二个参数, 是实例方法的参数
		// 此时可以通过"类::实例方法名"的形式引用方法
		BiPredicate<String, String> bp = (t, u) -> t.equals(u);
		BiPredicate<String, String> bp2 = String::equals;
	}

	// 类::静态方法名
	private static void test02() {
		//		Comparator<Integer> com = new Comparator<Integer>() {
		//			@Override
		//			public int compare(Integer o1, Integer o2) {
		//				return Integer.compare(o1, o2);
		//			}
		//		};
		// Comparator<Integer> com = (o1, o2) -> Integer.compare(o1, o2);
		Comparator<Integer> com = Integer::compare;
		com.compare(123, 124);
	}

	// 对象::实例方法名
	private static void test01() {
		// lambda表达所实现的功能: 传入参数, 在控制台输出
		// 该lambda表达式所实现的功能, 已被System.out对象的println方法所实现
		Consumer<String> con = str -> System.out.println(str);
		con.accept("abc");

		Consumer<String> con2 = System.out::println;
		con2.accept("fdsafsda");
	}
}
